home *** CD-ROM | disk | FTP | other *** search
- program Chaos;
-
- {Triangular fractal generator
-
- Based on program "Chaos" published in Nibble, June 1989 (Vol. 10, No. 6)
- One-Liner winner written by Max Raymond of Huston, TX. Program inspired
- by a PBS broadcast of Nova, called "Chaos".
-
- Adapted for Turbo Pascal by Scott Earnest, 1994.
- scott@whiplash.pc.cc.cmu.edu
-
- About the program:
-
- When the program is run, it will ask for 4 sets of coordinates. The first
- three are the vertices of the triangle, and the fourth is the location of
- the "traveler", the point that moves around the screen leaving its path.
- The traveler may start at any position either inside or outside the tri-
- angle. Press any key to exit the program.
-
- The original author's comment about the program:
-
- "A three-sided die is simulated, and its roll corresponds to one of
- the three vertices of the triangle. The traveler will move halfway
- from its current point toward the vertex selected by the die roll.
- A copy of the traveler is left behind at its old position, while
- the traveler is redrawn at its new position. The process is then
- repeated. The pattern that emerges is a record of the traveler's
- journey, as it jumps from point to point."
-
- }
-
- uses graph, crt;
-
- const BGIPath : string[80] = 'E:\BP\BGI';
-
- type
- TPoint = record
- x, y : integer;
- end;
-
- var
- grDriver,
- grMode,
- grError : integer;
-
- MaxX, MaxY : word;
-
- TriExt : array [1 .. 4] of TPoint;
-
- procedure StartGraph;
-
- begin
- grDriver := Detect;
- initgraph (grDriver, grMode, BGIPath);
- grError := GraphResult;
- if grError <> grOk then
- begin
- writeln ('Graphics error: ', GraphErrorMsg(grError));
- halt (1);
- end;
- MaxX := getmaxx;
- MaxY := getmaxy;
- end;
-
- procedure InputPoints;
-
- var
- pnum : byte;
- tx, ty : word;
-
- function inputnum (idx : byte; max : word; ch : char) : word;
-
- var
- inval, err : word;
- instr : string;
-
- begin
- repeat
- if idx < 4 then
- write ('Enter ',ch,' vertex #',idx,': ')
- else
- write ('Enter "traveler" start ',ch,': ');
- readln (instr);
- val (instr, inval, err);
- if (err > 0) or (inval > max) then
- writeln ('Invalid entry. Please re-enter.');
- until (inval <= Max);
- inputnum := inval;
- end;
-
- begin
- writeln ('Screen range = X:(0-',MaxX,'); Y:(0-',MaxY,').');
- for pnum := 1 to 4 do
- begin
- TriExt[pnum].x := inputnum (pnum, MaxX, 'X');
- TriExt[pnum].y := inputnum (pnum, MaxY, 'Y');
- end;
- end;
-
- procedure DrawChaos;
-
- var
- select : byte;
-
- begin
- while keypressed do readkey;
- repeat
- select := random(3) + 1;
- TriExt[4].x := TriExt[4].x + (TriExt[select].x - TriExt[4].x) div 2;
- TriExt[4].y := TriExt[4].y + (TriExt[select].y - TriExt[4].y) div 2;
- putpixel (TriExt[4].x, TriExt[4].y, 15);
- until keypressed;
- while keypressed do readkey;
- end;
-
- begin
- Randomize;
- StartGraph;
- RestoreCRTMode;
- clrscr;
- InputPoints;
- SetGraphMode (GetGraphMode);
- DrawChaos;
- CloseGraph;
- RestoreCRTMode;
- clrscr;
- end.